package guiasaude.reps;

import excecoes.ObjetoInexistenteException;
import excecoes.ObjetoJaExistenteException;
import excecoes.RepositorioException;
import guiasaude.UnidadeSaude;
import util.Excecoes;

public class RepositorioUnidadeSaudeArray implements IRepositorioUnidadeSaude {

	private UnidadeSaude[] vetor;

	private int indice;

	private int geraCodigo = 0; // para gerar codigos das queixas cadastradas

	public RepositorioUnidadeSaudeArray() {
		vetor = new UnidadeSaude[100];
		indice = 0;
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#insere(guiasaude.UnidadeSaude)
	 */
	public void insere(UnidadeSaude us) throws RepositorioException,
			ObjetoJaExistenteException {

		us.setCodigo(++geraCodigo);
		if (indice == this.vetor.length) {
			throw new RepositorioException("Erro ao incluir no array");
		}

		if (this.existe(us.getCodigo())) {
			throw new ObjetoJaExistenteException("Objeto jah existe no array");
		}

		this.vetor[indice] = us;
		indice++;
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#atualiza(guiasaude.UnidadeSaude)
	 */
	public void atualiza(UnidadeSaude us) throws RepositorioException,
			ObjetoInexistenteException {
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#deleta(int)
	 */
	public void deleta(int codigo) throws RepositorioException,
			ObjetoInexistenteException {
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#existe(int)
	 */
	public boolean existe(int codigo) throws RepositorioException {

		//int indiceAux = 0;
		boolean existe = false;

		for (int i = 0; i < indice; i++) {
			if (this.vetor[i].getCodigo() == codigo) {
				//indiceAux = i;
				existe = true;

				break;
			}
		}

		return existe;
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#procura(int)
	 */
	public UnidadeSaude procura(int codigo) throws RepositorioException,
			ObjetoInexistenteException {

		int i = 0;

		while (i < indice) {
			if (vetor[i].getCodigo() == codigo) {
				return vetor[i];
			}

			i++;
		}

		throw new ObjetoInexistenteException(Excecoes.EXC_FALHA_PROCURA);
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#getListaUnidadeSaude()
	 */
	public IRepositorioUnidadeSaude getListaUnidadeSaude()
			throws RepositorioException, ObjetoInexistenteException {
		return this;
	}

	// metodo inserido na fase de construcao - pega as unidades de saude de uma
	// especialidade
	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#getListaUnidadeSaudeporEspecialidade(int)
	 */
	public IRepositorioUnidadeSaude getListaUnidadeSaudeporEspecialidade(
			int codEspecialidade) throws RepositorioException,
			ObjetoInexistenteException {

		int aux = 0;
		boolean contem = false; // para nao retornar iterator, se tiver vazio
		IRepositorioUnidadeSaude r = new RepositorioUnidadeSaudeArray();

		System.out.println("Iniciou busca");

		while (aux < indice) {
			System.out.println("Entrou na primeira us aux=" + aux);

			IRepositorioEspecialidade re = vetor[aux].getEspecialidades();

			System.out.println("Pegou lista de especialidades");

			if (re != null) {
				System.out.println("existem especialidades");

				if (re.existe(codEspecialidade)) {
					System.out.println("Esta especialidade existe");

					try {
						contem = true;

						r.insere(vetor[aux]);
						System.out.println("inseriu esta us "
								+ vetor[aux].getDescricao());
					} catch (ObjetoJaExistenteException e) {
					}
				}
			}

			aux++;
		}

		if (contem) {
			return r;
		} else {
			return new RepositorioUnidadeSaudeArray();
		}
	}

	/* (non-Javadoc)
	 * @see guiasaude.reps.IRepositorioUnidadeSaude#size()
	 */
	public int size() {
		return this.indice;
	}

	public UnidadeSaude getElemento(int posicao) {
		if (posicao < indice)
			return this.vetor[posicao];
		else
			return null;
	}

}
